package org.apli.haiam.admin.jsf.managed;

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmDivisionPolitica;
import org.apli.haiam.ejb.entidades.AdmLugarAtencion;
import org.apli.haiam.ejb.entidades.AdmTipoInstitucion;
import org.apli.haiam.ejb.entidades.CexHistoriaClinica;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexHistoriaClinica.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfMigracionHc extends JsfBean<CexHistoriaClinica> {

    final Logger log = LoggerFactory.getLogger(JsfMigracionHc.class);
    byte[] bytes;
    private UsuarioAdmin user;
    private String nombreArchivo;
    private String tipoArchivo;
    private List<CexHistoriaClinica> listaMigrada;
    private AdmLugarAtencion admLugarAtencion;
    private AdmTipoInstitucion admTipoInstitucion;
    private List<CexHistoriaClinica> listaTemporal;
    private AdmDivisionPolitica admDivisionPolitica;
    private Date fechaAdmision;
    private final SimpleDateFormat formato = new SimpleDateFormat("yyyy/MM/dd");
    private final SimpleDateFormat formatoAdm = new SimpleDateFormat("yyyy/MM/dd");

    /**
     * Constructor por defecto.
     */
    public JsfMigracionHc() {

    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {

        object = new CexHistoriaClinica();
        lista = new ArrayList<>();
        nombreArchivo = "";
        tipoArchivo = "";
        listaMigrada = new ArrayList<>();
        listaTemporal = new ArrayList<>();
        try {
            admLugarAtencion = (AdmLugarAtencion) adminObject.buscar(AdmLugarAtencion.class, 1);
            admTipoInstitucion = (AdmTipoInstitucion) adminObject.buscar(AdmTipoInstitucion.class, 11);
            admDivisionPolitica = (AdmDivisionPolitica) adminObject.buscar(AdmDivisionPolitica.class, 1308);
            fechaAdmision = adminObject.getFechaDb();
        } catch (Exception e) {
            log.error("recuperar lugar atencion() {} ", e.getMessage());
        }
        user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");

    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    // METODO DE GUARDAR Y MODIFICAR
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        // PARA GUARDAR EN MAYUSCULAS
        for (CexHistoriaClinica cexHistoriaClinica : lista) {
            if (cexHistoriaClinica.getChcId() == null) {
                try {
                    // Validar que no se repita un paciente con el mismo numero de cedula
////                    if (!admin.existePorCampo(cexHistoriaClinica.getClass(), "chcCedula", cexHistoriaClinica.getChcCedula())) {
                    //Validar que no se repita un paciente con el mismo numero de historia clinica
                    if (!admin.existePorCampo(cexHistoriaClinica.getClass(), "chcHistoriaClinica", cexHistoriaClinica.getChcHistoriaClinica())) {
                        if (!admin.existePorCampo(cexHistoriaClinica.getClass(), "chcCedula", cexHistoriaClinica.getChcCedula())) {
                            //Convertir a mayusculas los nombres ingresados
                            cexHistoriaClinica.setChcIdUsuario(user.getUser().getIdUsuario());
                            cexHistoriaClinica.setChcNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                            cexHistoriaClinica.setChcApellidoPaterno(cexHistoriaClinica.getChcApellidoPaterno().toUpperCase().trim());
                            cexHistoriaClinica.setChcApellidoMaterno(cexHistoriaClinica.getChcApellidoMaterno().toUpperCase().trim());
                            cexHistoriaClinica.setChcPrimerNombre(cexHistoriaClinica.getChcPrimerNombre().toUpperCase().trim());
                            cexHistoriaClinica.setChcSegundoNombre(cexHistoriaClinica.getChcSegundoNombre().toUpperCase().trim());
                            cexHistoriaClinica.setChcNombrePadre(cexHistoriaClinica.getChcNombrePadre().toUpperCase().trim());
                            cexHistoriaClinica.setChcNombreMadre(cexHistoriaClinica.getChcNombreMadre().toUpperCase().trim());
                            cexHistoriaClinica.setChcEstado(1);
                            admin.crear(cexHistoriaClinica, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                            //inicializar();
                            listaMigrada.add(cexHistoriaClinica);
                        } else {
                            cexHistoriaClinica.setChcObservacion("Cédula repetida");
                            listaTemporal.add(cexHistoriaClinica);
                        }
                    } else {
                        cexHistoriaClinica.setChcObservacion("Historia clínica repetida");
                        listaTemporal.add(cexHistoriaClinica);
                    }
////                    } else {
////                        listaTemporal.add(cexHistoriaClinica);
////                    }
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                    return null;
                }
            } else {
                try {
                    admin.modificar(cexHistoriaClinica, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                }
            }
        }
        lista.clear();
        lista = listaTemporal;
        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
        return null;
    }

    public void listener(org.primefaces.event.FileUploadEvent event) throws Exception {
        try {
            bytes = IOUtils.toByteArray(event.getFile().getInputstream());
            nombreArchivo = event.getFile().getFileName();
            tipoArchivo = event.getFile().getContentType();
            cargarArchivo();
        } catch (IOException e) {
            log.error("listener() {} ", e.getMessage());
        }
    }

    public void migrarDivision() {
        try {
            AdmDivisionPolitica objTemp = new AdmDivisionPolitica();

            List<AdmDivisionPolitica> listaDivision = adminObject.listarOrdenada(AdmDivisionPolitica.class, "idDivision", true);
            for (AdmDivisionPolitica admDivisionPolitica : listaDivision) {
                if (adminObject.existePorCampo(AdmDivisionPolitica.class, "codigo", admDivisionPolitica.getCod())) {
                    objTemp = (AdmDivisionPolitica) adminObject.buscar(AdmDivisionPolitica.class, "codigo", admDivisionPolitica.getCod());
                    admDivisionPolitica.setAdmDivisionPolitica(objTemp);
                    admin.modificar(admDivisionPolitica, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                }
                ////////                if (admDivisionPolitica.getCod().length() == 1) {
                ////////                    admDivisionPolitica.setCod("0".concat(admDivisionPolitica.getCod()));

////////                } else {
////////                    if (admDivisionPolitica.getCod().length() == 3) {
////////                        admDivisionPolitica.setCod("0".concat(admDivisionPolitica.getCod()));
////////                        admin.modificar(admDivisionPolitica, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
////////                    }
////////                }
            }
        } catch (Exception e) {
            log.error("migrarDivision() {} ", e.getMessage());
        }
    }

    public void cargarArchivo() {
        FacesContext context = FacesContext.getCurrentInstance();
        //List cellDataList = new ArrayList();
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        int cont = 1;
        lista.clear();
        try {
            InputStream myInputStream = new ByteArrayInputStream(bytes);
            //FileInputStream fileInputStream = new FileInputStream(myInputStream);
            XSSFWorkbook workBook = new XSSFWorkbook(myInputStream);
            // indicamos la hoja que queremos leer
            //Se puede utilizar un for para recorrer todas las hojas que contenga ese archivo
            XSSFSheet hssfSheet = workBook.getSheetAt(0);
            // Recorremos las filas
            Iterator rowIterator = hssfSheet.rowIterator();
            while (rowIterator.hasNext()) {
                XSSFRow hssfRow = (XSSFRow) rowIterator.next();
                //Recorremos las celdas
                Iterator iterator = hssfRow.cellIterator();
                // List cellTempList = new ArrayList();
                while (iterator.hasNext()) {
                    XSSFCell hssfCell = (XSSFCell) iterator.next();

                    //Verificar segun el orden a cual campo se asigna el valor de la celda
                    //Numero de Historia Clinica
                    if (cont == 1) {
                        try {
                            object.setChcHistoriaClinica(hssfCell.getStringCellValue());
                            cont++;
                            continue;
                        } catch (Exception e) {
                            log.error("cedula paciente() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciene con Nº historia clinica " + object.getChcHistoriaClinica(), " Historia clinica " + e.getMessage()));
                            return;
                        }

                    }

                    //Apellido paterno
                    if (cont == 2) {
                        try {
                            object.setChcApellidoPaterno(hssfCell.getStringCellValue());
                            cont++;
                            continue;
                        } catch (Exception e) {
                            log.error("apellido paterno paciente() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Apellido paterno", e.getMessage()));
                            return;
                        }
                    }

                    //Apellido materno
                    if (cont == 3) {
                        try {
                            object.setChcApellidoMaterno(hssfCell.getStringCellValue());
                            cont++;
                            continue;
                        } catch (Exception e) {
                            log.error("apellido materno paciente() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Apellido materno", e.getMessage()));
                            return;
                        }
                    }

                    //Primer nombre
                    if (cont == 4) {
                        try {
                            object.setChcPrimerNombre(hssfCell.getStringCellValue());
                            cont++;
                            continue;
                        } catch (Exception e) {
                            log.error("nombre1 paciente() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Primer nombre", e.getMessage()));
                            return;
                        }
                    }

                    //Segundo nombre
                    if (cont == 5) {
                        try {
                            object.setChcSegundoNombre(hssfCell.getStringCellValue());
                            //Concantena el nombre completo
                            object.setChcNombreFull(object.getChcApellidoPaterno().concat(" ").concat(object.getChcApellidoMaterno()).concat(" ").concat(object.getChcPrimerNombre()).concat(" ").concat(object.getChcSegundoNombre()));
                            cont++;
                            continue;
                        } catch (Exception e) {
                            log.error("nombre 2 paciente() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Segundo nombre", e.getMessage()));
                            return;
                        }
                    }

                    //Nombre del padre
                    if (cont == 6) {
                        try {
                            object.setChcNombrePadre(hssfCell.getStringCellValue());
                            cont++;
                            continue;
                        } catch (Exception e) {
                            log.error("nombres de padre() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nombre del padre", e.getMessage()));
                            return;
                        }
                    }

                    //Nombre de la madre
                    if (cont == 7) {
                        try {
                            object.setChcNombreMadre(hssfCell.getStringCellValue());
                            cont++;
                            continue;
                        } catch (Exception e) {
                            log.error("nombres de la madre() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nombre de la madre", e.getMessage()));
                            return;
                        }
                    }

                    //Fecha de nacimiento
                    if (cont == 8) {
                        try {
                            if (hssfCell.getCellType() == Cell.CELL_TYPE_STRING) {
                                object.setChcFechaNacimiento(formato.parse(hssfCell.getStringCellValue()));
                            } else {
                                object.setChcFechaNacimiento(hssfCell.getDateCellValue());
                            }
                            cont++;
                            continue;
                        } catch (ParseException e) {
                            log.error("fecha de nacimiento paciente() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciene Nº de cedula " + object.getChcCedula() + " historia clinica " + object.getChcHistoriaClinica(), "Fecha de nacimiento " + e.getMessage()));
                            return;
                        }
                    }

                    //Numero de cédula del paciente
                    if (cont == 9) {
                        try {
                            object.setChcCedula(hssfCell.getStringCellValue());
                            cont++;
                            continue;
                        } catch (Exception e) {
                            log.error("cedula de cédula del paciente() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciene con Nº de cedula " + object.getChcCedula() + " historia clinica " + object.getChcHistoriaClinica(), " Cedula " + e.getMessage()));
                            return;
                        }

                    }

                    //Fecha de admision
                    if (cont == 10) {
                        try {
                            if (hssfCell.getCellType() == Cell.CELL_TYPE_STRING) {
                                object.setChcFechaAdmision(formatoAdm.parse(hssfCell.getStringCellValue()));
                            } else {
                                object.setChcFechaAdmision(hssfCell.getDateCellValue());
                            }
                            cont++;
                            continue;
                        } catch (ParseException e) {
                            log.error("fecha de admision paciente() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciene Nº de cedula " + object.getChcCedula() + " historia clinica " + object.getChcHistoriaClinica(), "Fecha de admision " + e.getMessage()));
                            return;
                        }
                    }

                    //Tipo ingreso
                    if (cont == 11) {
                        if (hssfCell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                            try {
                                object.setChcTipoIngreso((int) hssfCell.getNumericCellValue());
                                cont++;
                            } catch (Exception e) {
                                log.error("tipo ingreso() {} ", e.getMessage());
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciene Nº de cedula " + object.getChcCedula() + " historia clinica " + object.getChcHistoriaClinica(), "tipo ingreso " + e.getMessage()));
                                return;
                            }
                        } else {
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Tipo de dato incorrecto para el tipo de ingreso", "Tipo de dato incorrecto para el tipo de ingreso"));
                            return;
                        }
                    }
                    //  cellTempList.add(hssfCell);
                    //cont++;
                }

                object.setChcIdInstitucion(1);
                object.setChcNombreInstitucion("HOSPITAL DE ANTENCION INTEGRAL DEL ADULTO MAYOR");
                object.setChcIdInstitucionSistema(1);
                object.setChcNombreInstitucionSistema("MSP");
                object.setAdmLugarAtencion(admLugarAtencion);
                object.setAdmTipoInstitucion(admTipoInstitucion);
                object.setChcIdInstitucionSistema(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmInstitucionSistema().getIdInstitucionSistema());
                object.setChcNombreInstitucionSistema(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmInstitucionSistema().getNombre());
                object.setChcDipCodigoCanton(admDivisionPolitica.getCodigo());
                object.setChcDipCodigoParroquia(admDivisionPolitica.getAdmDivisionPolitica().getCodigo());
                object.setChcDipCodigoProvincia(admDivisionPolitica.getAdmDivisionPolitica().getAdmDivisionPolitica().getCodigo());
                object.setChcNombreCanton(admDivisionPolitica.getNombre());
                object.setChcNombreParroquia(admDivisionPolitica.getAdmDivisionPolitica().getNombre());
                object.setChcNombreProvincia(admDivisionPolitica.getAdmDivisionPolitica().getAdmDivisionPolitica().getNombre());
                object.setChcFechaAdmision(fechaAdmision);
                object.setChcNombreDistrito("17D03| - PUELLARO, CHAVEZPAMBA, ATAHUALPA, S.J MINAS, PERUCHO, EL CONDADO, PONCEANO, SAN ANTONIO, NONO, COTOCOLLAO, POMASQUI, CALACALI, COMITE DEL PUEBLO, CARCELEN");
                object.setChcEdad(0);
                lista.add(object);
                object = new CexHistoriaClinica();
                cont = 1;

                //  cellDataList.add(cellTempList);
            }
        } catch (IOException e) {
            log.error("{}: {} ", nombreMetodo, e);
        }

        //  Leer(cellDataList);
    }

    private void Leer(List cellDataList) {
//////        for (int i = 0; i < cellDataList.size(); i++) {
//////            List cellTempList = (List) cellDataList.get(i);
//////            for (int j = 0; j < cellTempList.size(); j++) {
//////                XSSFCell hssfCell = (XSSFCell) cellTempList.get(j);
//////                String stringCellValue = hssfCell.toString();
//////                System.out.print(stringCellValue + " ");
//////            }
//////            System.out.println();
//////        }
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            // lista = admin.listarOrdenada(object.getClass(), "aarNombre", true);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
////        try {
////            List<AgeArchivosAnexos> datos = admin.listarOrdenada(object.getClass(), "aarNombre", true);
////            List<SelectItem> items = new ArrayList<>();
////            for (AgeArchivosAnexos obj : datos) {
////                items.add(new SelectItem(obj, obj.getAarNombre()));
////            }
////            return items;
////        } catch (Exception e) {
////            log.error("getSelectedItem() {} ", e.getMessage());
////        }
        return null;
    }

    //***********************ecxel con extencion xls
    //////////////        try {
    //////////////            InputStream myInputStream = new ByteArrayInputStream(bytes);
    //////////////            //Workbook archivoExcel = Workbook.getWorkbook(new File("H:\\persnas.xls"));
    //////////////            Workbook archivoExcel = Workbook.getWorkbook(myInputStream);
    //////////////            System.out.println("Número de Hojas\t" + archivoExcel.getNumberOfSheets());
    //////////////            for (int sheetNo = 0; sheetNo < archivoExcel.getNumberOfSheets(); sheetNo++) // Recorre 
    //////////////            // cada    
    //////////////            // hoja                                                                                                                                                       
    //////////////            {
    //////////////                Sheet hoja = archivoExcel.getSheet(sheetNo);
    //////////////                int numColumnas = hoja.getColumns();
    //////////////                int numFilas = hoja.getRows();
    //////////////                String data;
    //////////////                System.out.println("Nombre de la Hoja\t" + archivoExcel.getSheet(sheetNo).getName());
    //////////////                for (int fila = 0; fila < numFilas; fila++) { // Recorre cada 
    //////////////                    // fila de la 
    //////////////                    // hoja 
    //////////////                    for (int columna = 0; columna < numColumnas; columna++) { // Recorre                                                                                
    //////////////                        // cada                                                                                
    //////////////                        // columna                                                                            
    //////////////                        // de                                                                                
    //////////////                        // la                                                                                
    //////////////                        // fila 
    //////////////                        data = hoja.getCell(columna, fila).getContents();
    //////////////                        System.out.print(data + " ");
    //////////////
    //////////////                    }
    //////////////                    System.out.println("\n");
    //////////////                }
    //////////////            }
    //////////////        } catch (IOException | BiffException | IndexOutOfBoundsException ioe) {
    //////////////            log.error("{}: {} ", nombreMetodo, ioe);
    //////////////        }
    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public String getNombreArchivo() {
        return nombreArchivo;
    }

    public void setNombreArchivo(String nombreArchivo) {
        this.nombreArchivo = nombreArchivo;
    }

    public String getTipoArchivo() {
        return tipoArchivo;
    }

    public void setTipoArchivo(String tipoArchivo) {
        this.tipoArchivo = tipoArchivo;
    }

    public List<CexHistoriaClinica> getListaMigrada() {
        return listaMigrada;
    }

    public void setListaMigrada(List<CexHistoriaClinica> listaMigrada) {
        this.listaMigrada = listaMigrada;
    }

}
